package com.atguigu.tingshu.album.api;

import com.atguigu.tingshu.album.config.MinioConstantProperties;
import io.minio.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.atguigu.tingshu.common.result.Result;
import java.util.UUID;

@Tag(name = "上传管理接口")
@RestController
@RequestMapping("api/album")
//@RefreshScope + @Value() 也可以动态批量的从配置文件里读取配置信息
public class FileUploadApiController{

    @Autowired
    private MinioConstantProperties minioConstantProperties;


    /**
     * @param file 文件上传的时候，前端会在页面组件封装一个name属性；这个属性是什么，MultipartFile 对象名称就是什么! file
     * @return
     */
    @Operation(summary = "文件上传")
    @PostMapping("fileUpload")
    public Result fileUpload(MultipartFile file){
        //返回数据的时候，返回值：文件上传之后的地址：url
        String url = "";

        //调用minio上传的API
        MinioClient minioClient = MinioClient.builder()
                .endpoint(minioConstantProperties.getEndpointUrl())
                .credentials(minioConstantProperties.getAccessKey(), minioConstantProperties.getSecreKey())
                .build();

        try {
            //判断桶是否存在
            boolean bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(minioConstantProperties.getBucketName()).build());
            if(!bucketExists){
                //桶不存在，创建桶
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioConstantProperties.getBucketName()).build());
            }else {
                //桶存在，打印 桶已经存在
                System.out.println("Bucket" + minioConstantProperties.getBucketName() + "already exists.");
            }
            //给上传文件设置 文件名 = UUID + 原文件名的后缀（去掉文件名只保留后缀名）
            String myFileName = UUID.randomUUID().toString().replaceAll("-", "") + file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
            System.out.println("fileName:\t" + myFileName);

            minioClient.putObject(
                    PutObjectArgs.builder().bucket(minioConstantProperties.getBucketName()).object(myFileName)
                            //将上传的文件以流的形式传输到MinIO服务器。getInputStream()获取文件输入流，
                            // getSize()获取文件大小，-1表示不指定分片大小，由MinIO自动处理。
                            .stream(file.getInputStream(),file.getSize(),-1)
                            //设置上传文件类型，通过getContentType获取上传文件类型（如 image/png、text/plain 等）
                            .contentType(file.getContentType())
                            .build());

            //返回数据url 没有赋值； url/bucketName/fileName
            url = minioConstantProperties.getEndpointUrl()+"/"+minioConstantProperties.getBucketName()+"/"+myFileName;
            System.out.println("url:\t" + url);
        } catch (Exception e) {
            //bucketExists 导致抛出异常
            e.printStackTrace();
        }

        //返回数据
        return Result.ok(url);
    }
}
